// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// 开始：构建asan 

package runtime

import (
	"unsafe"
)

// 公共广播消毒剂API。
func ASanRead(addr unsafe.Pointer, len int) {
	sp := getcallersp()
	pc := getcallerpc()
	doasanread(addr, uintptr(len), sp, pc)
}

func ASanWrite(addr unsafe.Pointer, len int) {
	sp := getcallersp()
	pc := getcallerpc()
	doasanwrite(addr, uintptr(len), sp, pc)
}

// 运行时的专用接口。
const asanenabled = true

// asan{read，write}是不分裂的，因为当堆栈不能增长时，它们可能在
// fork和exec之间调用。见第50391期。go:nosplit 

func asanread(addr unsafe.Pointer, sz uintptr) {
	sp := getcallersp()
	pc := getcallerpc()
	doasanread(addr, sz, sp, pc)
}

func asanwrite(addr unsafe.Pointer, sz uintptr) {
	sp := getcallersp()
	pc := getcallerpc()
	doasanwrite(addr, sz, sp, pc)
}

// go:noescape 
func doasanread(addr unsafe.Pointer, sz, sp, pc uintptr)

// go:noescape 
func doasanwrite(addr unsafe.Pointer, sz, sp, pc uintptr)

// go:noescape 
func asanunpoison(addr unsafe.Pointer, sz uintptr)

// go:noescape 
func asanpoison(addr unsafe.Pointer, sz uintptr)

// 。s 
// go:cgo\U import\U static\U asan\U read\U go 
// go:cgo\U import\U static\U asan\U write\U go 
// go cgo\U import\U asan\U unpoison\U 
// go go cgo\U import\U static\U asan\U go
